#ifndef __MQ_SENSOR_H
#define __MQ_SENSOR_H

#include "stm32f1xx_hal.h"  // 视芯片型号而定
#include <stdint.h>
#include  "mq_gas_curves.h"

/*
 * rl	负载电阻，一般是模块上的分压电阻（查数据手册或实测）
 * ratio_in_clean_air	各 MQ 模块在空气中的 Rs/Ro 比例（查 datasheet）
 * a, b	曲线拟合参数，一般从 datasheet 的 log-log 图拟合得到
 * ro	每次使用前在洁净空气中标定一次即可
 *
 *
 **/




typedef struct {
    ADC_HandleTypeDef* hadc;     // ADC 句柄
    uint32_t adc_channel;        // ADC 通道
    float vcc;                   // 工作电压，如 5.0
    float rl;                    // 负载电阻 (kΩ)
    float ratio_in_clean_air;    // 清洁空气下 Rs/Ro 比例（从 datasheet 获取）
    float ro;                    // 标定值（Ro）
} MQ_Sensor;

// 初始化传感器（设置 RL, VCC 等）注意：Ro 要通过标定获取
void MQ_Init(MQ_Sensor* mq, ADC_HandleTypeDef* hadc, uint32_t adc_channel,
             float vcc, float rl, float ratio_in_clean_air);




/* 基础功能函数 */
// 读取 ADC 并计算当前 Rs
float MQ_ReadRs(MQ_Sensor* mq);

// 获取当前气体浓度的比例（Rs/Ro）
float MQ_GetRatio(MQ_Sensor* mq);

// 使用拟合曲线计算浓度（PPM）
float MQ_GetPPM(MQ_Sensor* mq, float a, float b); // y = a * (Rs/Ro)^b

/* 标定相关函数 */
// 标定 Ro（在洁净空气中调用，返回 Ro）
float MQ_CalibrateRo(MQ_Sensor* mq, uint8_t sample_times);


/* ADC 值直接计算函数 */
// 传入 ADC 值计算当前 Rs
float MQ_ReadRs_ByADC(MQ_Sensor* mq, uint16_t adc_value);

// 传入 ADC 值标定 Ro
float MQ_CalibrateRo_ByADC(MQ_Sensor* mq, uint16_t* adc_values, uint8_t sample_times);

// 传入 ADC 值计算当前比例
float MQ_GetRatio_ByADC(MQ_Sensor* mq, uint16_t adc_value); 

// 传入 ADC 值计算当前浓度
float MQ_GetPPM_ByADC(MQ_Sensor* mq, uint16_t adc_value, float a, float b);



#endif
